function BrowserType() {
  // 权重：系统 + 系统版本 > 平台 > 内核 + 载体 + 内核版本 + 载体版本 > 外壳 + 外壳版本
  const ua = navigator.userAgent.toLowerCase();
  //'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/97.0.4692.71 safari/537.36'
  const testUa = regexp => regexp.test(ua);
  const testVs = regexp => (ua.match(regexp) + '').replace(/[^0-9|_.]/ig, '').replace(/_/ig, '.');

  // 系统
  let system = (() => {
    if (testUa(/windows|win32|win64|wow32|wow64/ig)) { return 'windows'; }// window系统
    if (testUa(/macintosh|macintel/ig)) { return 'osx'; }// osx系统
    if (testUa(/x11/ig)) { return 'linux'; }// linux系统
    if (testUa(/android|adr/ig)) { return 'android'; }// android系统
    if (testUa(/ios|iphone|ipad|ipod|iwatch/ig)) { return 'ios'; }// ios系统
    return '未知系统'
  })();

  // 系统版本
  let systemVs = ((system) => {
    if (system === 'windows') {
      if (testUa(/windows nt 5.0|windows 2000/ig)) { return '2000'; }
      if (testUa(/windows nt 5.1|windows xp/ig)) { return 'xp'; }
      if (testUa(/windows nt 5.2|windows 2003/ig)) { return '2003'; }
      if (testUa(/windows nt 6.0|windows vista/ig)) { return 'vista'; }
      if (testUa(/windows nt 6.1|windows 7/ig)) { return '7'; }
      if (testUa(/windows nt 6.2|windows 8/ig)) { return '8'; }
      if (testUa(/windows nt 6.3|windows 8.1/ig)) { return '8.1'; }
      if (testUa(/windows nt 10.0|windows 10/ig)) { return '10'; }
    }
    if (system === 'osx') { return testVs(/os x [\d._]+/ig); }
    if (system === 'android') { return testVs(/android [\d._]+/ig); }
    if (system === 'ios') { return testVs(/os [\d._]+/ig); }
    return '未知系统版本';
  })(system);
  // 平台
  let platform = (() => {
    if (system === 'windows' || system === 'osx' || system === 'linux') { return 'desktop'; }// 桌面端
    if (system === 'android' || system === 'ios' || testUa(/mobile/ig)) { return 'mobile'; } // 移动端
    return '未知平台';
  })();

  // 内核
  let engine = (() => {
    if (testUa(/applewebkit/ig)) { return 'webkit'; }// webkit内核
    if (testUa(/safari/ig)) { return 'webkit'; }// webkit内核

    if (testUa(/gecko/ig)) { return 'gecko'; }// gecko内核
    if (testUa(/firefox/ig)) { return 'gecko'; }// gecko内核

    if (testUa(/presto/ig)) { return 'presto'; }// presto内核
    if (testUa(/trident|compatible|msie/ig)) { return 'trident' }// trident内核
    return '未知内核'
  })()
  // 内核版本
  let engineVs = ((engine) => {
    if (engine === 'webkit') { return testVs(/applewebkit\/[\d.]+/ig); }
    if (engine === 'gecko') { return testVs(/gecko\/[\d.]+/ig); }
    if (engine === 'presto') { return testVs(/presto\/[\d.]+/ig); }
    if (engine === 'trident') { return testVs(/trident\/[\d.]+/ig); }
    return '未知内核版本'
  })(engine);
  // 载体
  let supporter = ((engine) => {
    if (engine === 'webkit') {
      if (testUa(/edge/ig)) { return 'edge'; } // edge浏览器
      if (testUa(/opr/ig)) { return 'opera'; } // opera浏览器
      if (testUa(/chrome/ig)) { return 'chrome'; } // chrome浏览器
      return 'safari'; // safari浏览器
    }
    if (engine === 'gecko') { return 'firefox'; } // firefox浏览器
    if (engine === 'presto') { return 'opera'; } // opera浏览器
    if (engine === 'trident') { return 'iexplore'; }// iexplore浏览器
    return '未知载体'
  })(engine);
  // 载体版本
  let supporterVs = ((supporter) => {
    if (supporter === 'chrome') { return testVs(/chrome\/[\d.]+/ig); }
    if (supporter === 'safari') { return testVs(/version\/[\d.]+/ig); }
    if (supporter === 'firefox') { return testVs(/firefox\/[\d.]+/ig); }
    if (supporter === 'opera') { return testVs(/opr\/[\d.]+/ig); }
    if (supporter === 'iexplore') { return testVs(/(msie [\d.]+)|(rv:[\d.]+)/ig); }
    if (supporter === 'edge') { return testVs(/edge\/[\d.]+/ig); }
    return '未知载体版本'
  })(supporter);

  // 实际应用：判断浏览器函数
  let isMobile = (() => {
    return testUa(/(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windows phone)/ig)
  })()
  let isWechart = (() => {
    if (isMobile) {
      if (testUa(/micromessenger/ig)) {
        return true;
      }
    }
    return false;
  })()

  // 外壳和外壳版本
  let [shell, shellVs] = (() => {
    if (isWechart) {
      return ['微信浏览器', testVs(/micromessenger\/[\d.]+/ig)];
    }
    if (testUa(/qqbrowser/ig)) {
      return ['QQ浏览器', testVs(/qqbrowser\/[\d.]+/ig)];
    }
    if (testUa(/ubrowser/ig)) {
      return ['UC浏览器', testVs(/ubrowser\/[\d.]+/ig)];
    }
    if (testUa(/2345explorer/ig)) {
      return ['2345浏览器', testVs(/2345explorer\/[\d.]+/ig)];
    }
    if (testUa(/metasr/ig)) {
      return ['搜狗浏览器', '未知搜狗版本']
    }
    if (testUa(/lbbrowser/ig)) {
      return ['猎豹浏览器', '未知猎豹版本']
    }
    if (testUa(/maxthon/ig)) {
      return ['遨游浏览器', testVs(/maxthon\/[\d.]+/ig)];
    }
    if (testUa(/bidubrowser/ig)) {
      return ['百度浏览器', testVs(/bidubrowser [\d.]+/ig)];
    }
    return ['未知外壳', '未知外壳版本']
  })();

  return Object.assign({}, {
    '系统': system, // windows osx linux android ios
    '系统版本': systemVs,
    '内核': engine, // webkit gecko presto trident
    '内核版本': engineVs,
    '平台': platform, // desktop mobile
    '载体': supporter, // chrome safari firefox opera iexplore edge
    '载体版本': supporterVs,
    '是移动端': isMobile,
    '是微信': isWechart,
    '外壳': shell, // wechat qq uc 2345 sougou liebao maxthon baidu
    '外壳版本': shellVs,
  });
}

function compareVersion(v1, v2) {//版本对比
  v1 = v1.split('.')
  v2 = v2.split('.')
  const len = Math.max(v1.length, v2.length)
  while (v1.length < len) { v1.push('0') }
  while (v2.length < len) { v2.push('0') }
  let res = (() => {
    for (let i = 0; i < len; i++) {
      const num1 = parseInt(v1[i]) || 0;
      const num2 = parseInt(v2[i]) || 0;
      if (num1 > num2) { return 1; }
      if (num1 < num2) { return -1; }
    }
    return 0
  })()
  return {
    isNewer: res === 1,
    isOlder: res === -1,
    isSame: res === 0,
  }
}

export {
  BrowserType,
  compareVersion
};